﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace XYS.Service.Core.Util
{
    /// <summary>
    /// 
    /// </summary>
    public static class DateTimeHelper
    {

        /// <summary>
        /// 取随机时间
        /// </summary>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <returns></returns>
        public static TimeSpan RandomDelay(TimeSpan min, TimeSpan max) => GetRandomDelay(min, max);

        /// <summary>
        /// 取随机时间
        /// </summary>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <returns></returns>
        public static TimeSpan GetRandomDelay(TimeSpan min, TimeSpan max)
        {
            ValidateInput(min, max);
            if (min.TotalMilliseconds == max.TotalMilliseconds) return min;

            // 根据入参获取延迟的时间
            Random random = new(Guid.NewGuid().GetHashCode());
            double milliseconds = (random.NextDouble() * (max.TotalMilliseconds - min.TotalMilliseconds)) + min.TotalMilliseconds;

            return TimeSpan.FromMilliseconds(milliseconds);
        }
        /// <summary>
        /// 取值范围检测
        /// </summary>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <exception cref="ArgumentException"></exception>
        private static void ValidateInput(TimeSpan min, TimeSpan max)
        {
            if (min < TimeSpan.Zero)
                throw new ArgumentException("最小值不能为负数", nameof(min));

            if (max < TimeSpan.Zero)
                throw new ArgumentException("最大值不能为负数", nameof(max));

            if (min > max)
                throw new ArgumentException("最小值不能大于最大值", nameof(min));
        }


        /// <summary>
        /// 取较小的时间
        /// </summary>
        /// <param name="dateTime1"></param>
        /// <param name="dateTime2"></param>
        /// <returns></returns>
        public static DateTime Min(DateTime dateTime1, DateTime dateTime2)
        {
            if (dateTime1 < dateTime2) return dateTime1;
            else if (dateTime1 > dateTime2) return dateTime2;
            else return dateTime1;
        }
        /// <summary>
        /// 取较小的时间
        /// </summary>
        /// <param name="dateTime1"></param>
        /// <param name="dateTime2"></param>
        /// <returns></returns>
        public static TimeSpan Min(TimeSpan dateTime1, TimeSpan dateTime2)
        {
            if (dateTime1 < dateTime2) return dateTime1;
            else if (dateTime1 > dateTime2) return dateTime2;
            else return dateTime1;
        }



        /// <summary>
        /// 取较大的时间
        /// </summary>
        /// <param name="dateTime1"></param>
        /// <param name="dateTime2"></param>
        /// <returns></returns>
        public static DateTime Max(DateTime dateTime1, DateTime dateTime2)
        {
            if (dateTime1 > dateTime2) return dateTime1;
            else if (dateTime1 < dateTime2) return dateTime2;
            else return dateTime1;
        }


        /// <summary>
        /// 取较大的时间
        /// </summary>
        /// <param name="dateTime1"></param>
        /// <param name="dateTime2"></param>
        /// <returns></returns>
        public static TimeSpan Max(TimeSpan dateTime1, TimeSpan dateTime2)
        {
            if (dateTime1 > dateTime2) return dateTime1;
            else if (dateTime1 < dateTime2) return dateTime2;
            else return dateTime1;
        }



        /// <summary>
        /// 取较小的时间
        /// </summary>
        /// <param name="dateTime1"></param>
        /// <param name="dateTime2"></param>
        /// <returns></returns>
        public static DateTime? Min(DateTime? dateTime1, DateTime? dateTime2)
        {
            if (dateTime1 == null && dateTime2 == null) return null;
            else if (dateTime1 == null) return dateTime2;
            else if (dateTime2 == null) return dateTime1;
            else if (dateTime1 < dateTime2) return dateTime1;
            else if (dateTime1 > dateTime2) return dateTime2;
            else return dateTime1;
        }

        /// <summary>
        /// 取较大的时间
        /// </summary>
        /// <param name="dateTime1"></param>
        /// <param name="dateTime2"></param>
        /// <returns></returns>
        public static DateTime? Max(DateTime? dateTime1, DateTime? dateTime2)
        {
            if (dateTime1 == null && dateTime2 == null) return null;
            else if (dateTime1 == null) return dateTime2;
            else if (dateTime2 == null) return dateTime1;
            else if (dateTime1 > dateTime2) return dateTime1;
            else if (dateTime1 < dateTime2) return dateTime2;
            else return dateTime1;
        }

    }
}
